package com.xxxtea.cf;

import cn.hutool.core.bean.BeanUtil;
import com.xxxtea.entity.Cart;
import com.xxxtea.entity.Collect;
import com.xxxtea.entity.Dish;
import com.xxxtea.entity.OrderItem;
import com.xxxtea.service.CartService;
import com.xxxtea.service.CollectService;
import com.xxxtea.service.DishService;
import com.xxxtea.service.OrderItemService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 商品推荐服务实现
 * 
 * 基于用户行为（购物车、收藏、下单）实现商品的协同过滤推荐。
 * 继承抽象推荐服务，封装商品推荐相关的行为数据获取与推荐逻辑。
 * 
 * @author badman
 * @since 1.0.0
 */
@Service
public class ProductRecommenderService extends AbstractRecommenderService<Dish, UserProductBehavior> {
	/** 购物车服务 */
	@Resource
	private CartService cartService;
	/** 收藏服务 */
	@Resource
	private CollectService collectService;
	/** 商品服务 */
	@Resource
	private DishService dishService;
	/** 订单明细服务 */
	@Resource
	private OrderItemService orderItemService;

	/**
	 * 获取指定用户的所有商品行为（购物车、收藏、下单）
	 * @param userId 用户ID
	 * @return 用户商品行为列表
	 */
	@Override
	protected List<UserProductBehavior> getUserBehaviors(Integer userId) {
		List<UserProductBehavior> behaviors = new ArrayList<>();
		// 购物车行为，评分5分
		behaviors.addAll(
				cartService.lambdaQuery().eq(userId != null, Cart::getUserId, userId).list().stream()
						.map(e -> BeanUtil.toBean(e, UserProductBehavior.class).setScore(5d))
						.collect(Collectors.toList())
		);
		// 收藏行为，评分4分
		behaviors.addAll(
				collectService.lambdaQuery().eq(userId != null, Collect::getUserId, userId).list().stream()
						.map(e -> BeanUtil.toBean(e, UserProductBehavior.class).setScore(4d))
						.collect(Collectors.toList())
		);
		// 下单行为，评分20分
		behaviors.addAll(
				orderItemService.lambdaQuery().eq(userId != null, OrderItem::getUserId, userId).list().stream()
						.map(e -> BeanUtil.toBean(e, UserProductBehavior.class).setScore(20d))
						.collect(Collectors.toList())
		);
		return behaviors;
	}

	/**
	 * 根据商品ID获取商品对象
	 * @param itemId 商品ID
	 * @return 商品对象
	 */
	@Override
	protected Dish getItemById(Integer itemId) {
		return dishService.getById(itemId);
	}

	/**
	 * 获取所有用户的商品行为数据
	 * @return 所有用户商品行为列表
	 */
	@Override
	protected List<UserProductBehavior> getAllUserBehaviors() {
		return getUserBehaviors(null);
	}
}